home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / ASM-SPAR.{_6 / SEMAPHOR.{2T < prev    next >
Text File  |  1999-09-17  |  3KB  |  159 lines

  1. #ifndef _SPARC_SEMAPHORE_H
  2. #define _SPARC_SEMAPHORE_H
  3.  
  4. /* Dinky, good for nothing, just barely irq safe, Sparc semaphores. */
  5.  
  6. #ifdef __KERNEL__
  7.  
  8. #include <asm/atomic.h>
  9.  
  10. struct semaphore {
  11.     atomic_t count;
  12.     atomic_t waking;
  13.     struct wait_queue * wait;
  14. };
  15.  
  16. #define MUTEX ((struct semaphore) { ATOMIC_INIT(1), ATOMIC_INIT(0), NULL })
  17. #define MUTEX_LOCKED ((struct semaphore) { ATOMIC_INIT(0), ATOMIC_INIT(0), NULL })
  18.  
  19. extern void __down(struct semaphore * sem);
  20. extern int __down_interruptible(struct semaphore * sem);
  21. extern int __down_trylock(struct semaphore * sem);
  22. extern void __up(struct semaphore * sem);
  23.  
  24. #define sema_init(sem, val)    atomic_set(&((sem)->count), val)
  25.  
  26. extern inline void down(struct semaphore * sem)
  27. {
  28.     register atomic_t *ptr asm("g1");
  29.     register int increment asm("g2");
  30.  
  31.     ptr = (atomic_t *) __atomic_fool_gcc(sem);
  32.     increment = 1;
  33.  
  34.     __asm__ __volatile__("
  35.     mov    %%o7, %%g4
  36.     call    ___atomic_sub
  37.      add    %%o7, 8, %%o7
  38.     tst    %%g2
  39.     bl    2f
  40.      nop
  41. 1:
  42.     .subsection 2
  43. 2:    save    %%sp, -64, %%sp
  44.     mov    %%g1, %%l1
  45.     mov    %%g5, %%l5
  46.     call    %3
  47.      mov    %%g1, %%o0
  48.     mov    %%l1, %%g1
  49.     ba    1b
  50.      restore %%l5, %%g0, %%g5
  51.     .previous\n"
  52.     : "=&r" (increment)
  53.     : "0" (increment), "r" (ptr), "i" (__down)
  54.     : "g3", "g4", "g7", "memory", "cc");
  55. }
  56.  
  57. extern inline int down_interruptible(struct semaphore * sem)
  58. {
  59.     register atomic_t *ptr asm("g1");
  60.     register int increment asm("g2");
  61.  
  62.     ptr = (atomic_t *) __atomic_fool_gcc(sem);
  63.     increment = 1;
  64.  
  65.     __asm__ __volatile__("
  66.     mov    %%o7, %%g4
  67.     call    ___atomic_sub
  68.      add    %%o7, 8, %%o7
  69.     tst    %%g2
  70.     bl    2f
  71.      clr    %%g2
  72. 1:
  73.     .subsection 2
  74. 2:    save    %%sp, -64, %%sp
  75.     mov    %%g1, %%l1
  76.     mov    %%g5, %%l5
  77.     call    %3
  78.      mov    %%g1, %%o0
  79.     mov    %%l1, %%g1
  80.     mov    %%l5, %%g5
  81.     ba    1b
  82.      restore %%o0, %%g0, %%g2
  83.     .previous\n"
  84.     : "=&r" (increment)
  85.     : "0" (increment), "r" (ptr), "i" (__down_interruptible)
  86.     : "g3", "g4", "g7", "memory", "cc");
  87.  
  88.     return increment;
  89. }
  90.  
  91. extern inline int down_trylock(struct semaphore * sem)
  92. {
  93.     register atomic_t *ptr asm("g1");
  94.     register int increment asm("g2");
  95.  
  96.     ptr = (atomic_t *) __atomic_fool_gcc(sem);
  97.     increment = 1;
  98.  
  99.     __asm__ __volatile__("
  100.     mov    %%o7, %%g4
  101.     call    ___atomic_sub
  102.      add    %%o7, 8, %%o7
  103.     tst    %%g2
  104.     bl    2f
  105.      clr    %%g2
  106. 1:
  107.     .subsection 2
  108. 2:    save    %%sp, -64, %%sp
  109.     mov    %%g1, %%l1
  110.     mov    %%g5, %%l5
  111.     call    %3
  112.      mov    %%g1, %%o0
  113.     mov    %%l1, %%g1
  114.     mov    %%l5, %%g5
  115.     ba    1b
  116.      restore %%o0, %%g0, %%g2
  117.     .previous\n"
  118.     : "=&r" (increment)
  119.     : "0" (increment), "r" (ptr), "i" (__down_trylock)
  120.     : "g3", "g4", "g7", "memory", "cc");
  121.  
  122.     return increment;
  123. }
  124.  
  125. extern inline void up(struct semaphore * sem)
  126. {
  127.     register atomic_t *ptr asm("g1");
  128.     register int increment asm("g2");
  129.  
  130.     ptr = (atomic_t *) __atomic_fool_gcc(sem);
  131.     increment = 1;
  132.  
  133.     __asm__ __volatile__("
  134.     mov    %%o7, %%g4
  135.     call    ___atomic_add
  136.      add    %%o7, 8, %%o7
  137.     tst    %%g2
  138.     ble    2f
  139.      nop
  140. 1:
  141.     .subsection 2
  142. 2:    save    %%sp, -64, %%sp
  143.     mov    %%g1, %%l1
  144.     mov    %%g5, %%l5
  145.     call    %3
  146.      mov    %%g1, %%o0
  147.     mov    %%l1, %%g1
  148.     ba    1b
  149.      restore %%l5, %%g0, %%g5
  150.     .previous\n"
  151.     : "=&r" (increment)
  152.     : "0" (increment), "r" (ptr), "i" (__up)
  153.     : "g3", "g4", "g7", "memory", "cc");
  154. }    
  155.  
  156. #endif /* __KERNEL__ */
  157.  
  158. #endif /* !(_SPARC_SEMAPHORE_H) */
  159.